package org.example.study2;

// 如何处理sleep状态下的中断请求
// 通过interrupt()通知线程终止，而不是强制停止
public class Demo_207 {
    public static void main(String[] args) throws InterruptedException {
        // 创建新线程
        Thread thread = new Thread(() -> {
            // 通过线程对象内部维护的中断标识，判断当前线程是否需要中断
            while (!Thread.currentThread().isInterrupted()) {
                // 线程中具体的任务
                System.out.println("张三转账处理中...");

                // 线程大部分时间在sleep
                try {
                    // 线程休眠1秒（此时可能被中断）
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // 当sleep被中断时会抛出异常
                    e.printStackTrace();
                    System.out.println("休眠被中断");
                }
            }
            System.out.println("转账终止");
        },"张三");

        // 线程启动前存活状态
        System.out.println("线程是否存活：" + thread.isAlive());
        System.out.println("主线程: 启动张三转账");
        thread.start();
        // 主线程休眠1秒（确保子线程进入sleep状态）
        Thread.sleep(1000);
        System.out.println("线程是否存活：" + thread.isAlive());
        System.out.println("主线程: 紧急通知！对方是骗子，停止转账！");
        // 中断线程，发出中断信号（将中断sleep状态）
        thread.interrupt();
        // 等待线程销毁
        thread.join();
        // 查看最终存活状态
        System.out.println("线程是否存活：" + thread.isAlive());

    }
}

/*
输出：
线程是否存活：false
主线程: 启动张三转账
张三转账处理中...
张三转账处理中...
线程是否存活：true
主线程: 紧急通知！对方是骗子，停止转账！
休眠被中断
张三转账处理中...
java.lang.InterruptedException: sleep interrupted
	at java.base/java.lang.Thread.sleep(Native Method)
	at org.example.study2.Demo_207.lambda$main$0(Demo_207.java:17)
	at java.base/java.lang.Thread.run(Thread.java:842)
线程是否存活：true
张三转账处理中...
张三转账处理中...
张三转账处理中...
张三转账处理中...
张三转账处理中...
。。。。。。（无限循环无法退出）
*/

// 总结：中断线程时发现抛了个异常，意思是线程在sleep状态时，执行了中断操作， 因为中断的是休眠状态的线程